# ifndef __TransverseMercator_H_
# define __TransverseMercator_H_

# include "Transform.h"
# include "Ellipsoid.h"

class CTransverseMercatorToLL : public CTransformationBase {
  public:
	CTransverseMercatorToLL (const CEllipsoid & _e, double _k0, double _FE, double _FN, double _x0, double _y0, bool _bSouthOriented = false);

	virtual void ApplyTo (point_t & _point) const;

  private:
	const CEllipsoid m_Ellipsoid;
	// The scale factor.
	const double m_k0;
	// False Easting & Northing.
	const double m_FE, m_FN;
	// Longitude of the natural origin.
	const double m_x0;
	// Some parameter depending on the latitude of the natural origin.
	const double m_M0;

	const bool m_bSouthOriented;
};

class CLLToTransverseMercator : public CTransformationBase {
  public:
	CLLToTransverseMercator (const CEllipsoid & _e, double _k0, double _FE, double _FN, double _x0, double _y0);

	virtual void ApplyTo (point_t & _point) const;

  private:
	const CEllipsoid m_Ellipsoid;
	// The scale factor.
	const double m_k0;
	// False Easting & Northing.
	const double m_FE, m_FN;
	// Longitude of the natural origin.
	const double m_x0;
	// Some parameter depending on the latitude of the natural origin.
	const double m_M0;
};

class CUTM_North : public CTransverseMercatorToLL {
  public:
	CUTM_North (const CEllipsoid & _e, size_t _cZone);
};

class CUTM_South : public CTransverseMercatorToLL {
  public:
	CUTM_South (const CEllipsoid & _e, size_t _cZone);
};

class CLL2UTM_North : public CLLToTransverseMercator {
  public:
	CLL2UTM_North (const CEllipsoid & _e, size_t _cZone);
};

class CLL2UTM_South : public CLLToTransverseMercator {
  public:
	CLL2UTM_South (const CEllipsoid & _e, size_t _cZone);
};

class CBritishNationalGrid : public CTransverseMercatorToLL {
  public:
	CBritishNationalGrid ();
};

class CSwissCoordinateSystem : public CTransverseMercatorToLL {
  public:
	CSwissCoordinateSystem ();
};

class CSwedishRT90_25GonW : public CTransverseMercatorToLL {
  public:
	CSwedishRT90_25GonW ();
};

class CIrishTMGrid : public CTransverseMercatorToLL {
  public:
	CIrishTMGrid ();
};

class CDHDNGrid : public CTransverseMercatorToLL {
  public:
	CDHDNGrid (float _fAveX);
};

class CItalyGrid1 : public CTransverseMercatorToLL {
  public:
	CItalyGrid1 ();
};

class CItalyGrid2 : public CTransverseMercatorToLL {
  public:
	CItalyGrid2 ();
};

# endif // __TransverseMercator_H_